#include <iostream>
#include <ros/ros.h>
#include <rosbag/bag.h>

#include "demo/User1.h"
#include "demo/User2.h"
#include "User.pb.h"
#include "User1.pb.h"
#include "User2.pb.h"

class RemapBase {
public:
    virtual void remap(rosbag::Bag &bag, const google::protobuf::Message &msg) = 0;
};

class UserImpl1 : public RemapBase {
public:
    void remap(rosbag::Bag &bag, const google::protobuf::Message &msg) override {
        auto pb_msg = dynamic_cast<const proto::User1 &>(msg);
        demo::User1 ros_msg;
        ros_msg.field1 = pb_msg.field1();
        ros_msg.field2 = pb_msg.field2();
        ros_msg.field3 = pb_msg.field3();
        bag.write("user1", ros::Time::now(), ros_msg);
        printf("user1.remap(): %d, %d, %d\n", ros_msg.field1, ros_msg.field2, ros_msg.field3);
    }
};

class UserImpl2 : public RemapBase {
public:
    void remap(rosbag::Bag &bag, const google::protobuf::Message &msg) {
        auto pb_msg = dynamic_cast<const proto::User2 &>(msg);
        demo::User2 ros_msg;
        ros_msg.field1 = pb_msg.field1();
        ros_msg.field2 = pb_msg.field2();
        ros_msg.field3 = pb_msg.field3();
        bag.write("user2", ros::Time::now(), ros_msg);
        printf("user2.remap(): %d, %d, %d\n", ros_msg.field1, ros_msg.field2, ros_msg.field3);
    }
};
